"""
语音转文本服务
提供语音转文本功能，使用工厂模式创建具体实现
"""

import os
from typing import Tuple, Dict, Any

# 导入STT工厂类
from .factory import STTFactory
# 导入返回码枚举
from ..constants.return_codes import BaseCodeEnum, STTErrorCode
# 导入日志工具
from ..utils.logger import get_logger


class STTService:
    """
    语音转文本服务类
    作为使用者角色，通过工厂类获取具体实现完成STT功能
    """

    def __init__(self, model_name: str = "base"):
        """
        初始化STT服务
        
        Args:
            model_name: STT模型名称，传递给具体实现类
        """
        # 初始化日志记录器
        self.logger = get_logger(__name__)
        # 设置模型名称
        self.model_name = model_name
        # 通过工厂创建STT实现实例
        self.stt_implementation = STTFactory.create_implementation()
        self.logger.info(f"已加载STT实现: {type(self.stt_implementation).__name__}")

    def speech_to_text(self, audio_file: str, language: str = None) -> Tuple[BaseCodeEnum, Dict[str, Any]]:
        """
        将语音转换为文本
        
        Args:
            audio_file: 音频文件路径
            language: 语言代码，如果为None则自动检测
            
        Returns:
            Tuple[int, str, Dict[str, Any]]: (状态码, 识别文本, 结果信息)
            - 状态码: 200表示成功，5001表示参数错误，5002表示文件不存在，5003表示转换失败
            - 识别文本: 转换得到的文本内容
            - 结果信息: 包含转换详情的字典
        """
        self.logger.info(f"开始语音转文本: audio_file={audio_file}, language={language}")

        # 参数验证
        if not audio_file:
            self.logger.error("音频文件路径为空")
            return STTErrorCode.AUDIO_PATH_EMPTY, {}

        if not os.path.exists(audio_file):
            self.logger.error(f"音频文件不存在: {audio_file}")
            return STTErrorCode.AUDIO_NOT_FOUND, {}

        try:
            # 使用工厂创建的具体实现进行语音转文本
            return_code, result = self.stt_implementation.speech_to_text(
                audio_file=audio_file,
                language=language,
                model_name=self.model_name  # 传递给具体实现
            )

            return return_code, result

        except Exception as e:
            # 捕获实现类抛出的异常并转换为标准错误码
            self.logger.error(f"STT实现类调用失败: {str(e)}")
            return STTErrorCode.CONVERSION_FAILED, {}
